﻿// ===============================================================================
//  Copyright © ymind.net. All rights reserved .
//  官方网站：http://ymind.net/
//  版权所有：彦铭工作室 老陈出品
// ===============================================================================

using System;
using System.Collections.Specialized;
using System.Web;
using Lcsoft.UrlRewriter.Errors;

namespace Lcsoft.UrlRewriter.Utilities
{
	/// <summary>
	/// 表示 HTTP 请求的上下文信息的封装。
	/// </summary>
	internal class HttpContextFacade : IContextFacade
	{
		/// <summary>
		/// 初始化 <see cref="HttpContextFacade"/> 类的新实例。
		/// </summary>
		public HttpContextFacade() { this.MapPath = HttpContext.Current.Server.MapPath; }

		#region IContextFacade Members

		/// <summary>
		/// 获取 <see cref="IContextFacade.MapPath"/>。
		/// </summary>
		public MapPath MapPath { get; private set; }

		/// <summary>
		/// 返回应用程序路径。
		/// </summary>
		/// <returns></returns>
		public string GetApplicationPath() { return HttpContext.Current.Request.ApplicationPath; }

		/// <summary>
		/// 返回原始请求地址。
		/// </summary>
		/// <returns>包含原始请求地址的 <see cref="System.String"/>。</returns>
		public string GetRawUrl() { return HttpContext.Current.Request.RawUrl; }

		/// <summary>
		/// 返回当前请求地址。
		/// </summary>
		/// <returns>包含当前请求地址的 <see cref="System.String"/>。</returns>
		public Uri GetRequestUrl() { return HttpContext.Current.Request.Url; }

		/// <summary>
		/// 设置 HTTP 状态码。
		/// </summary>
		/// <param name="code">HTTP 状态码。</param>
		public void SetStatusCode(int code) { HttpContext.Current.Response.StatusCode = code; }

		/// <summary>
		/// 重写当前请求地址为指定路径。
		/// </summary>
		/// <param name="url">要重写到的虚拟路径。</param>
		public void RewritePath(string url) { HttpContext.Current.RewritePath(url, false); }

		/// <summary>
		/// 设置 URL 转向。
		/// </summary>
		/// <param name="url">要跳转到的 URL。</param>
		public void SetRedirectLocation(string url) { HttpContext.Current.Response.RedirectLocation = url; }

		/// <summary>
		/// 在标题信息集合末尾追加一个新的标头。
		/// </summary>
		/// <param name="name">标头信息名称。</param>
		/// <param name="value">标头信息的值。</param>
		public void AppendHeader(string name, string value) { HttpContext.Current.Response.AppendHeader(name, value); }

		/// <summary>
		/// 在 <see cref="HttpCookie"/> 集合末尾追加一个新的 <see cref="HttpCookie"/>。
		/// </summary>
		/// <param name="cookie"><see cref="HttpCookie"/>。</param>
		public void AppendCookie(HttpCookie cookie) { HttpContext.Current.Response.AppendCookie(cookie); }

		/// <summary>
		/// 处置错误信息。
		/// </summary>
		/// <param name="handler">一个错误处理提供程序的实例。</param>
		public void HandleError(IRewriteErrorHandler handler) { handler.HandleError(HttpContext.Current); }

		/// <summary>
		/// 设置上下文信息中的自定义键值对中指定键的值。
		/// </summary>
		/// <param name="item">键名。</param>
		/// <param name="value">键值。</param>
		public void SetItem(object item, object value) { HttpContext.Current.Items[item] = value; }

		/// <summary>
		/// 获取上下文信息中的自定义键值对中指定键的值。
		/// </summary>
		/// <param name="item">键名。</param>
		/// <returns>键值。</returns>
		public object GetItem(object item) { return HttpContext.Current.Items[item]; }

		/// <summary>
		/// 获取当前请求的类型。
		/// </summary>
		/// <returns>表示当前请求类型的 <see cref="System.String"/>。</returns>
		public string GetHttpMethod() { return HttpContext.Current.Request.HttpMethod; }

		/// <summary>
		/// 返回服务器变量信息的集合。
		/// </summary>
		/// <returns><see cref="NameValueCollection"/>。</returns>
		public NameValueCollection GetServerVariables() { return HttpContext.Current.Request.ServerVariables; }

		/// <summary>
		/// 返回标头信息集合。
		/// </summary>
		/// <returns><see cref="NameValueCollection"/>。</returns>
		public NameValueCollection GetHeaders() { return HttpContext.Current.Request.Headers; }

		/// <summary>
		/// 返回 <see cref="HttpCookie"/> 的集合。
		/// </summary>
		/// <returns><see cref="HttpCookieCollection"/>。</returns>
		public HttpCookieCollection GetCookies() { return HttpContext.Current.Request.Cookies; }

		#endregion
	}
}
